import axios, {type AxiosInstance, type AxiosRequestConfig, type AxiosResponse} from 'axios';
import {Button, message, Space} from 'antd';
import router from '@/router/index.tsx'
import store from '@/store/index.tsx'
import {changeUserToken, changeLoading} from '@/store/userSlice';
// 基础配置，可依据环境进行调整
const baseConfig: AxiosRequestConfig = {
    baseURL: import.meta.env.VITE_API_BASE_URL,
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json',
        // Accept: 'application/json',
    },
};

// 创建Axios实例
const axiosInstance: AxiosInstance = axios.create(baseConfig);

// 请求拦截器
axiosInstance.interceptors.request.use(
    (config: AxiosRequestConfig) => {
        if (!config.hasOwnProperty("noLoading")) {
            store.dispatch(changeLoading(true))
            delete config.noLoading
        }
        // 在此添加认证令牌
        const token = localStorage.getItem('auth_token');
        if (token) {
            config.headers.token = token;
        }
        return config;
    },
    (error) => {
        store.dispatch(changeLoading(false))
        return Promise.reject(error);
    }
);

// 响应拦截器
axiosInstance.interceptors.response.use(
    (response: AxiosResponse) => {
        switch (response.data.code) {
            case 0:
                store.dispatch(changeUserToken(null))
                router.navigate(`/login`)
                // message.open({
                //     type: 'success',
                //     content: 'This is a success message',
                // })
                break;
            case 300:
                // console.log('00000000000', message)
                message.open({
                    type: 'error',
                    content: response.msg,
                })
                break;
            case 401:
                // 处理未授权情况，例如跳转到登录页
                break;
            case 403:
                // 处理禁止访问的情况
                break;
            case 500:
                // 处理服务器错误
                break;
        }
        store.dispatch(changeLoading(false))
        // blob类型返回完成响应数据
        if (response.request.responseType === 'blob') {
            return response
        }
        return response.data;
    },
    (error) => {
        // 对错误进行统一处理
        // 可根据状态码执行不同操作
        if (error.response) {
            switch (error.response.status) {
                case 300:
                    // 处理禁止访问的情况
                    message.error()
                    break;
                case 401:
                    // 处理未授权情况，例如跳转到登录页
                    break;
                case 403:
                    // 处理禁止访问的情况
                    break;
                case 500:
                    // 处理服务器错误
                    break;
            }
        }
        store.dispatch(changeLoading(false))
        return Promise.reject(error);
    }
);

export default axiosInstance;